package com.zhuss.core.processor;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.zhuss.bean.bo.core.config.type.SearchConfigTypeBo;
import com.zhuss.bean.vo.core.config.type.ListConfigTypeVo;
import com.zhuss.common.ListStringVo;
import com.zhuss.common.PageVo;
import com.zhuss.common.SelectStringVo;
import com.zhuss.core.db.dao.ext.ConfigTypeDao;
import com.zhuss.core.db.entity.ConfigType;
import com.zhuss.exception.AabException;
import com.zhuss.exception.ExceptionCode;


/**
 * 查询配置类型 processor
 * @Author: zhushanshuo
 * @Date: 2020/02/20 21:55
 */
@Component("configTypeRead")
public class ConfigTypeRead {
	
	@Autowired
	private ConfigTypeDao configTypeDao;
	
	
	/**
	 * 配置类型下拉
	 * @return
	 */
	public List<SelectStringVo> configTypeList(String typeGroup) {
		List<ConfigType> list = configTypeDao.listByTypeGroup(typeGroup, null);
		List<SelectStringVo> result = new ArrayList<>();
		for (ConfigType c : list) {
			SelectStringVo sv = new SelectStringVo(c.getType(), c.getValue(), c.getType());
			result.add(sv);
		}
		return result;
	}
	
	public ConfigType getBySort(Integer sort) {
		ConfigType result = null;
		List<ConfigType> list = listByType(null);
		for (ConfigType c : list) {
			if (c.getSort().equals(sort)) {
				result = c;
			}
		}
		return result;
	}
	
	
	/**
	 * 根据type查询配置类型
	 * @param  
	 * @param 
	 * @return
	 */
	public List<ConfigType> listByType(String type) {
		List<ConfigType> result = configTypeDao.listAll(type);
		return result;
	}
	
	/**
	 * 根据value查询配置类型
	 * @param  
	 * @param 
	 * @return
	 */
	public List<ConfigType> listByValue(String value) {
		List<ConfigType> result = new ArrayList<ConfigType>();
		List<ConfigType> list = listByType(null);
		for (ConfigType c : list) {
			if (c.getValue().equals(value)) {
				result.add(c);
			}
		}
		return result;
	}
	
	/**
	 * 查询最大的sort
	 * @param  
	 * @param 
	 * @return
	 */
	public Integer getMaxSort() {
		List<ConfigType> list = listByType(null);
		Integer sort = 0;
		for (ConfigType c : list) {
			Integer s = c.getSort();
			if (s > sort) {
				sort = s;
			}
		}
		return sort;
	}
	
	/**
	 * 根据sort查询配置类型
	 * @param  
	 * @param 
	 * @return
	 */
	public List<ConfigType> listBySort(Integer sort) {
		List<ConfigType> result = new ArrayList<ConfigType>();
		List<ConfigType> list = listByType(null);
		for (ConfigType c : list) {
			if (c.getSort().equals(sort)) {
				result.add(c);
			}
		}
		return result;
	}
	
	/**
	 * 根据sort查询配置类型
	 * @param  
	 * @param 
	 * @return
	 */
	public List<ConfigType> listNotIdBySort(Integer sort, Long configTypeId) {
		List<ConfigType> result = new ArrayList<ConfigType>();
		List<ConfigType> list = listByType(null);
		for (ConfigType c : list) {
			if (c.getSort().equals(sort) && !c.getConfigTypeId().equals(configTypeId)) {
				result.add(c);
			}
		}
		return result;
	}
	
	/**
	 * 根据value查询配置类型
	 * @param  
	 * @param 
	 * @return
	 */
	public List<ConfigType> listNotIdByValue(String value, Long configTypeId) {
		List<ConfigType> result = new ArrayList<ConfigType>();
		List<ConfigType> list = listByType(null);
		for (ConfigType c : list) {
			if (c.getValue().equals(value) && !c.getConfigTypeId().equals(configTypeId)) {
				result.add(c);
			}
		}
		return result;
	}
	
	
	
	public List<ConfigType> listNotId(String type, Long configTypeId) {
		List<ConfigType> result = new ArrayList<ConfigType>();
		List<ConfigType> list = listByType(type);
		for (ConfigType c : list) {
			if (!c.getConfigTypeId().equals(configTypeId)) {
				result.add(c);
				break;
			}
		}
		return result;
	}
	
	
	/**
	 * 配置类型ID列表
	 * @return
	 */
	public Object listConfigTypeKey(String type) {
		List<ConfigType> configTypeList = configTypeDao.listAll(type);
		List<Long> result = new ArrayList<>();
		for (ConfigType configType : configTypeList) {
			result.add(configType.getConfigTypeId());
		}
		return result;
	}
	
	/**
	 * 配置类型
	 * @return
	 */
	public Object listConfigType(String type) {
		List<ConfigType> configTypeList = configTypeDao.listAll(type);
		List<ListStringVo> result = new ArrayList<>();
		transferList(configTypeList, result);
		return result;
	}
	
	/**
	 * 配置类型 
	 * @return
	 */
	public Object listConfigTypeId(String type) {
		List<ConfigType> configTypeList = configTypeDao.listAll(type);
		List<Long> result = new ArrayList<>();
		transferListId(configTypeList, result);
		return result;
	}
	
	private void transferListId(List<ConfigType> configTypeList, List<Long> result) {
		for (ConfigType item : configTypeList) {
			result.add(item.getConfigTypeId());
		}
	}

	private void transferList(List<ConfigType> configTypeList, List<ListStringVo> result) {
		for (ConfigType item : configTypeList) {
			ListStringVo vo = new ListStringVo();
			vo.setKey(item.getType());
			vo.setLabel(item.getValue());
			result.add(vo);
		}
		
	}

	/**
	 * 配置类型列表
	 * @param bo
	 * @return
	 */
	public Object list(SearchConfigTypeBo bo) {
//		bo.setPageSize(Integer.MAX_VALUE);
		PageVo<ListConfigTypeVo> result = new PageVo<ListConfigTypeVo>();
        result.setPageNum(bo.getPageNum());
        result.setPageSize(bo.getPageSize());
        result.setItems(configTypeDao.list(bo));
        result.setTotal(configTypeDao.countList(bo));
		return result;
	}
	
	/**
	 * 配置类型详情
	 * @param configTypeId
	 * @return
	 * @throws AabException
	 */
	public Object detail(Long configTypeId) throws AabException {
		Object result = configTypeDao.detail(configTypeId);
		if (result == null) {
			throw new AabException(ExceptionCode.数据不存在);
		}
		return result;
	}
	
	

}
